package com.code.generate.core;

import com.code.generate.entity.DataBase;
import com.code.generate.entity.Settings;
import com.code.generate.entity.Table;
import com.code.generate.utils.DataBaseUtils;
import com.code.generate.utils.PropertiesUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 1.采集用户UI界面输入的数据
 * 模板位置
 * 代码生成路径
 * 工程配置对象 setting
 * 数据库对象   DataBase
 * 2.准备数据模型
 * 1.自定义配置
 * 2.元数据
 * 3.setting
 * 3.调用核心处理类完成代码生成工作
 * 方法：Generator
 *
 * @author hl
 */
public class GeneratorFacade {

  private String templatePath;
  private String outPath;
  private Settings settings;
  private DataBase db;
  private Generator generator;

  public GeneratorFacade(String templatePath, String outPath, Settings settings, DataBase db) throws Exception {
    this.templatePath = templatePath;
    this.outPath = outPath;
    this.settings = settings;
    this.db = db;
    this.generator = new Generator(templatePath, outPath);
  }

  /**
   * 准备数据模型
   * 调用核心处理类完成代码生成工作
   */
  public void generatorByDataBase() throws Exception {
    List<Table> tables = DataBaseUtils.getDbInfo(db);
    for (Table table : tables) {
      //对每一个Table对象进行代码生成
      /**
       * 数据模型
       * 调用Generator核心处理类
       */
      Map<String, Object> dataModel = getDataModel(table, tables);
      generator.scanAndGenerator(dataModel);
    }
  }

  /**
   * 根据table对象获取数据模型
   */
  private Map<String, Object> getDataModel(Table table, List<Table> tables) {
    Map<String, Object> dataModel = new HashMap<>();
    //自定义配置
    dataModel.putAll(PropertiesUtils.customMap);
    //元数据table.name2
    dataModel.put("table", table);
    //setting
    dataModel.putAll(this.settings.getSettingMap());
    //4.类型
    dataModel.put("ClassName", table.getName2());

    ArrayList<HashMap<String, String>> tableList = new ArrayList<>();
    for (Table tb : tables) {
      HashMap<String, String> map = new HashMap<>();
      // 首字母大写
      map.put("tableName",tb.getName2());
      // 前端路由
      map.put("frontRouting",tb.getFrontRouting());
      // 表描述
      map.put("comment",tb.getComment());
      tableList.add(map);
    }
    //5.所有的表名字
    dataModel.put("tableList", tableList);

    return dataModel;
  }
}
